Jak naplnit TStrings pomoci DLL?
Otázka od: little_bobes@centrum.cz
7. 7. 2004 7:22
Zdravim,
mam tu problem s DLL, se kterym si nevim rady.
----------------------------------------------------------------------------
Mam definovanou nasledujici strukturu (stejnou strukturu pouziva jak hlavni
program, tak i DLL):
type
PCommonParams = ^TCommonParams;
TCommonParams = record
Fields: TStrings;
... // je tu vice promennych
end;
----------------------------------------------------------------------------
Funkci v knihovne volam z hlavniho programu takto:
var
CommonParamsPTR: PCommonParams;
CommonParams: TCommonParams;
...
CommonParams.Fields := TStringList.Create;
CommonParamsPTR := @CommonParams;
...
if DLL_Funkce(CommonParamsPTR, PChar(Error)) then
ShowMessage(CommonParamsPTR^.Fields.Text)
else
ShowMessage(Error);
...
FreeAndNil(CommonParamsPTR^.Fields); // zde ale dochazi k AV
...
----------------------------------------------------------------------------
V DLL plnim Fields takto:
function DLL_Funkce(CommonParams: PCommonParams; Error: PChar): Boolean;
stdcall;
...
// vyplnim seznam sloupcu a jejich hodnoty
For loop := 0 to Q1.FieldCount - 1 do
CommonParams^.Fields.Values[Q1.Fields[loop].FieldName] :=
Q1.Fields[loop].AsString;
...
Promenna Fields v recordu se v DLL spravne naplnila, ale problem nastava
pozdeji, kdyz chci v hlavnim programu zrusit promennou Fields.
Problem je podle me v tom, jak se v DLL vyplnuji Values, ale bohuzel nevim,
jak jinak toto vyresit, protoze potrebuji k textum ve Fields pristupovat
pomoci IndexOf a Values.
Poradite mi nekdo, jak na to? Predem dekuji.
Bob
(D4 c/s, FB 1.5)
Odpovedá: tondrej@t-online.de
7. 7. 2004 8:00
Zdar,
> mam tu problem s DLL, se kterym si nevim rady.
> --------------------------------------------------------------------------
--
> Mam definovanou nasledujici strukturu (stejnou strukturu pouziva jak
> hlavni program, tak i DLL):
> type
> PCommonParams = ^TCommonParams;
> TCommonParams = record
> Fields: TStrings;
> ... // je tu vice promennych
> end;
> --------------------------------------------------------------------------
--
> Funkci v knihovne volam z hlavniho programu takto:
> var
> CommonParamsPTR: PCommonParams;
> CommonParams: TCommonParams;
> ...
> CommonParams.Fields := TStringList.Create;
> CommonParamsPTR := @CommonParams;
> ...
> if DLL_Funkce(CommonParamsPTR, PChar(Error)) then
> ShowMessage(CommonParamsPTR^.Fields.Text)
> else
> ShowMessage(Error);
> ...
> FreeAndNil(CommonParamsPTR^.Fields); // zde ale dochazi k AV
Ak chces do DLL a spet predavat stringy, musis mat v uses obidvoch projektov
(ako prvu) unitu ShareMem.
HTH
TOndrej
Odpovedá: little_bobes@centrum.cz
7. 7. 2004 9:19
Jenze to nepomuze
Bob
> > ...
> > if DLL_Funkce(CommonParamsPTR, PChar(Error)) then
> > ShowMessage(CommonParamsPTR^.Fields.Text)
> > else
> > ShowMessage(Error);
> > ...
> > FreeAndNil(CommonParamsPTR^.Fields); // zde ale dochazi k AV
>
> Ak chces do DLL a spet predavat stringy, musis mat v uses obidvoch
projektov
> (ako prvu) unitu ShareMem.
>
Odpovedá: Jakub Dusek
7. 7. 2004 11:30
TStringList v DLL bez pouziti balicku je jiny nez TStringList v EXE.
Jakub Dusek
----------------------------------------------------------------------
web: http://www.corexpert.com, mobile: +420 604 615 795, ICQ: 86063232
odesilani smsek, vizitek, log a melodii, snadna integrace do Vaseho IS
=> Sms GateKeeper, Sms GateKeeper Service
======================================================================
Wednesday, July 7, 2004, 8:09:56 AM, you wrote:
lcc> CommonParams.Fields := TStringList.Create;